#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>

using namespace std;

void Usage(string proc)
{
    cout << "Usage:\n\t" << proc << " signum pid\n\n";
}

void work()
{
    cout << "print log..." << endl;
}

void myhandler(int signo)
{
    work();

    cout << "process get a signal, number: " << signo <<endl; //我什么都没干,只是打印消息

    int n = alarm(5);

    cout << "剩余时间" << n << endl;
    //exit(0);
}

void PrintPending(sigset_t &pending)
{
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&pending,i))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }

    cout << endl << endl;
}

void handler(int signo)
{
    cout << "catch a signo: " << signo << endl;
}

int main()
{
    signal(2,handler);
    //1. 先对2号信号进行屏蔽
    sigset_t bset,oset;      //在哪开辟的空间? ? ? 用户栈上的, 属于用户区
    sigemptyset(&bset);
    sigemptyset(&oset);

    sigaddset(&bset,2); //我们已经把二号信号屏蔽了吗? 并没有设置进你的进程 pcb_struct

    //1.2 调用系统调用, 将数据设置进内核
    sigprocmask(SIG_SETMASK,&bset,&oset); //将2号信号进行屏蔽

    //2. 重复打印当前进程的pending 0000 0000 0000 0000 0000 0000
    sigset_t pending;
    int cnt = 0;

    while (true)
    {   
        //2.1 获取
        int n = sigpending(&pending);
        if (n < 0) continue;
        //2.2 打印
        PrintPending(pending);

        sleep(1);
        cnt++;

        //2.3 解除阻塞
        if (cnt==20)
        {
            cout << "unblock 2 signo" << endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
    }

    //3. 发送2号信号 0000 0000 0000 0000 0000 0010


}

// int main()
// {
//     //signal(2,SIG_IGN);
//     signal(2,SIG_DFL);

//     while(1)
//     {
//         cout << "hello signal" << endl;
//         sleep(1);
//     }
// }


// int main()
// {
//     pid_t id = fork();

//     if (id == 0)
//     {
//         //child
//         int cnt = 500;

//         while (cnt)
//         {
//             cout << "I am a child process, pid: " << getpid() << endl;
//             sleep(1);
//             cnt--;
//         }

//         exit(0);
//     }

//     //father
//     int status = 0;
//     pid_t rid = waitpid(id,&status,0);

//     if (rid == id)
//     {
//         cout << "child quit info, rid: " << rid << " ,exit code: " << ((status>>8)&0xff) << " ,exit signal: " << (status&0x7f) << " ,core dump: " << ((status>>7)&1) << endl;
//     }
// }

// int main()
// {
//     signal(SIGALRM,myhandler);

//     int n = alarm(5);

//     while (1)
//     {
//         cout << "process is running..., pid is : " << getpid() << endl;
//         sleep(1);
       
//     }

//     return 0;
// }

// int main()
// {
//     signal(SIGFPE,myhandler);

//     cout << "div before" << endl;

//     cout << "my pid is: " << getpid() << endl;
//     sleep(1);

//     int a = 10;
//     a /= 0;

//     cout << "div afater" << endl;
//     sleep(1);
// }

// int main()
// {
//     signal(SIGABRT,myhandler);

//     int cnt = 0;

//     while (true)
//     {
//         cout << "I am a process, pid: " << getpid() << endl;
//         sleep(1);
//         cnt++;

//         if (cnt % 2 == 0)
//         {
//             abort();
//         }
//     }
// }

// int main(int argc,char* argv[])
// {
//     if (argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }

//     int signum = stoi(argv[1]);
//     pid_t pid = stoi(argv[2]);

//     int n = kill(pid,signum);

//     if (n == -1)
//     {
//         perror("kill");
//         exit(2);
//     }

//     return 0;

// }

//int: 收到了哪一个信号
// void myhandler(int signo)
// {
//     cout << "process get a signal" << endl;
//     exit(0);
// }

// int main()
// {
//     signal(SIGINT,myhandler);

//     while (true)
//     {
//         cout << "I am a crazy process " << getpid() <<endl;
//         sleep(1);
//     }
// }
